﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.ServiceModel.DomainServices.Server;
using System.ServiceModel.DomainServices.Server.ApplicationServices;
using System.Runtime.Serialization;

namespace IssueVision.Data.Web
{
    /// <summary>
    /// LoginUser class derives from User class and implements IUser interface,
    /// it only exposes the following three data members to the client:
    /// Name, Password, ProfileResetFlag, and Roles
    /// </summary>
    [DataContractAttribute(IsReference = true)]
    [MetadataTypeAttribute(typeof(LoginUser.LoginUserMetadata))]
    public sealed class LoginUser : User, IUser
    {
        // This class allows you to attach custom attributes to properties
        // of the LoginUser class.
        //
        // For example, the following marks the Xyz property as a
        // required field and specifies the format for valid values:
        //    [Required]
        //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
        //    [StringLength(32)]
        //    public string Xyz;
        internal sealed class LoginUserMetadata : UserMetadata
        {

            // Metadata classes are not meant to be instantiated.
            private LoginUserMetadata()
            {
            }

            [Key]
            [Display(Name = "UserNameLabel", ResourceType = typeof(IssueVisionResources))]
            [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ErrorResources))]
            [RegularExpression("^[a-zA-Z0-9_]*$", ErrorMessageResourceName = "ValidationErrorInvalidUserName", ErrorMessageResourceType = typeof(ErrorResources))]
            public new string Name { get; set; }

            [Exclude]
            public new string Email { get; set; }

            [Exclude]
            public string FirstName { get; set; }

            [Exclude]
            public string LastName { get; set; }

            [Exclude]
            public string NewPassword { get; set; }

            [Exclude]
            public string PasswordQuestion { get; set; }

            [Exclude]
            public string PasswordAnswer { get; set; }

            [Exclude]
            public string UserType { get; set; }

            [Exclude]
            public bool IsUserMaintenance { get; set; }
        }

        [DataMember]
        public IEnumerable<string> Roles
        {
            get
            {
                switch (UserType)
                {
                    case "A":
                        return new List<string> { 
                                                    IssueVisionServiceConstant.UserTypeUser, 
                                                    IssueVisionServiceConstant.UserTypeAdmin };
                    case "U":
                        return new List<string> { "User" };
                    default:
                        return new List<string>();
                }
            }
            set
            {
                if (value.Contains(IssueVisionServiceConstant.UserTypeAdmin))
                {
                    // Admin User
                    UserType = "A";
                }
                else if (value.Contains(IssueVisionServiceConstant.UserTypeUser))
                {
                    // Normal User
                    UserType = "U";
                }
                else
                    UserType = String.Empty;
            }
        }
    }
}
